跳到主要内容

Julia 并行计算

多线程并行

@threads 循环上并行

循环上并行是一种比较高级的模式,假定循环中的每一次都不相关。

@spawn 任务级并行

任务级并行与 Go 和 Cilk 等语言相似,由语言的运行时对任务池来调度。

这种方法的好处是不需要真正创建新的线程(绿色线程),以避免操作系统不停在不同的线程中切换,这对数值计算的性能有比较大的影响。

此外,因为任务是动态调度的,可能存在一定的冗余,但是有的时候也更快。

原子

原子操作可以保证只有一个线程能使用某一个堆上的数据。

acc = Atomic{Int64}(0)
@threads for i in 1:10_000
atomic_add!(acc, 1)
end
acc

  • 自旋锁 SpinLock:上锁后别人不能再使用,自己也不能再次上锁
  • 二次进入锁 ReentrantLock:自己可以上锁两次